package cn.zyq.charging.order.quartz_job;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * ApplicationContextAware 是 Spring 框架中的一个接口，用于让实现该接口的类能够获取到 ApplicationContext 对象。
 * 通过实现这个接口，可以方便地在 Bean 中访问 Spring 容器中的其他 Bean 或者容器本身提供的功能。
 * 主要用途:
 * 1.访问容器：获取 ApplicationContext 实例，从而可以访问容器中的其他 Bean。
 * 2.事件发布：可以通过 ApplicationContext 发布应用事件。
 * 3.资源加载：可以使用 ApplicationContext 加载文件资源
 */
//线程安全：如果多个线程同时访问 context，需要确保线程安全。
//替代方案：Spring 5.0 以后推荐使用 @Autowired 注解来注入 ApplicationContext，
//而不是实现 ApplicationContextAware 接口。
@Slf4j
@Component
public class SpringContextJobUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        this.applicationContext=ac;
    }

    /**
     * 通过Bean的名称和类型获取容器中的bean对象
     * @param beanName
     * @param requiredType
     * @return
     */
    public static <T>T getBean(String beanName,Class<T> requiredType){
        return applicationContext.getBean(beanName, requiredType);
    }

    //这个方法本项目没有使用
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
}
//替代方案：
/**
 * import org.springframework.beans.factory.annotation.Autowired;
 * import org.springframework.context.ApplicationContext;
 * import org.springframework.stereotype.Component;
 *
 * @Component
 * public class MyBean {
 *     private final ApplicationContext context;
 *
 *     @Autowired
 *     public MyBean(ApplicationContext context) {
 *         this.context = context;
 *     }
 *
 *     public Object getBean(String beanName) {
 *         return context.getBean(beanName);
 *     }
 * }
 */
//总结
//ApplicationContextAware 接口允许 Bean 获取 ApplicationContext 对象。
//可以通过实现 ApplicationContextAware 接口或使用 @Autowired 注解来获取 ApplicationContext。
//使用 @Autowired 注解更加简洁和现代。